<?php
/**
 * Crud para relacionamento de categorias com tabela relacionada
 * @author Emanuel e Wiliame @ PC4 Team em 15/02/2012
 *
 */
class PC4_Crud_MuitosParaMuitos extends PC4_Crud_UmParaMuitos {
	
	public 
		$tabelaRel,
		$modeloRel,
		$fkCategoria,
		$aliasCategoria,
		$aliasRel,
		$alias;
		
    public function init() {
    	parent::init();
    	$this->tabelaRel = ($this->config['tabelaRel'] == null) ? $this->_name . '_rel_' . $this->tabelaCategoria : $this->config['tabelaRel'];
		if (empty($this->modeloRel)) {
	    	$this->modeloRel = new PC4_Db_Table(array(
				Zend_Db_Table::NAME => $this->tabelaRel,
				Zend_Db_Table::PRIMARY => array($this->pk . '_' . $this->_name, $this->fk)
			));
		}
		else {
			$this->tabelaRel = $this->modeloRel->_name;
		}
    	$this->fkCategoria = (empty($this->config['fkCategoria'])) ? $this->pkCategoria . '_' . $this->tabelaCategoria : $this->config['fkCategoria'];

		$this->aliasCategoria = $this->getAlias($this->tabelaCategoria);
    	$this->aliasRel = $this->getAlias($this->tabelaRel);
    	$this->alias = $this->getAlias($this->_name);
    }
    
    /**
     * Devolve um conjunto de registros relacionados as suas categorias
     * @return Zend_Db_Table_Rowset
     */
    function preparaConsulta($where = null, $order = null, $count = null, $offset = null) {
    	$select = parent::preparaConsulta($where, $order, $count, $offset);
    	$select->setIntegrityCheck(false);
    	// remove o relacionamento um para muitos anterior
    	$select->reset(Zend_Db_Table_Select::FROM);
    	$select->from(array($this->getAlias($this->_name) => $this->_name));

    	// Join com a tabela de relacionamentos
		$select->joinLeft(
        	array($this->aliasRel => $this->tabelaRel),
			$this->aliasRel . '.' . $this->pk . '_' . $this->_name . ' = ' . $this->alias . '.' . $this->pk,
			array()
        );

		// Join com a tabela de categorias
        $select->joinLeft(
        	array($this->aliasCategoria => $this->tabelaCategoria),
			$this->aliasRel . '.' . $this->pk . '_' . $this->tabelaCategoria . ' = ' . $this->aliasCategoria . '.' . $this->pk,
        	array($this->pk . '_' . $this->tabelaCategoria => $this->aliasCategoria . '.id', 'categoria' => $this->aliasCategoria . '.' . $this->nomeCategoria)
        );
        return $select;
    }
    

	function insert($data) {
		$idsCategoria = $data[$this->fk];
		// TODO: Implementar uma verificacao se a categoria existe quando for insercao de categoria em conjunto com os relacionamentos,
		// TODO: Se existir, nao, duplicar e manter a categoria existente
//$categorias = $this->getCategorias($this->pkCategoria . ' IN (' . implode(',', $data[$this->fk]) . ')');
//new d($categorias); die;
		unset($data[$this->fk]);
		// Inserindo na tabela principal e resgatando o id inserido
		$id = parent::insert($data);
		
		if (!empty($id)) {
			foreach ((array)$idsCategoria as $idCategoria) {
				$campos = array(
					$this->pk . '_' . $this->_name => $id,
					$this->fk => $idCategoria
				);
				$this->modeloRel->insert($campos);
			}
		}
		return $id;
	}
	
	function update($data, $where) {
		$idsCategoria = $data[$this->fk];
		if (!empty($idsCategoria)) {
			// TODO: Implementar uma verificacao se a categoria existe quando for insercao de categoria em conjunto com os relacionamentos,
			// TODO: Se existir, nao, duplicar e manter a categoria existente
			unset($data[$this->fk]);
			$this->modeloRel->delete($this->pk . '_' . $this->_name .' = ' . $data[$this->pk]);
			
			foreach ((array)$idsCategoria as $idCategoria) {
				$campos = array(
					$this->pk . '_' . $this->_name => $data[$this->pk],
					$this->fk => $idCategoria
				);
				$this->modeloRel->insert($campos);
			}
		}
		return parent::update($data, $where);
	}
	
}